目的別に関数の説明をしていきます.
画像の複製 cvCloneImage()/cvCopy()
IplImageをコピーするには,
cvCloneImage() → 明示的なメモリ確保が不要 cvCopy() → 明示的なメモリ確保が必要
のどちらかを利用します.
IplImage* cvCloneImage(const IplImage* src); src コピー元のIplImage.
- cvCloneImage() の場合,明示的なメモリ確保は不要.
void cvCopy(const CvArr* src, CvArr* dst, const CvArr* mask=NULL); src コピー元の配列. dst コピー先の配列. mask 8ビットシングルチャンネル配列の処理マスク.コピー先の配列の変更する要素を指定する.
コピー元配列とコピー先配列は,同じ型,同じ次元,同じサイズである必要があります.
- cvCopy() の場合,明示的なメモリ確保が必要.
表色系の変換 cvCvtColor()
画像の表色系を変換します.
void cvCvtColor(const CvArr* src, CvArr* dst, int code); src 入力配列. dst 出力配列. code 変換元->変換先の表色系を表す定数を指定. ・CV_BGR2GRAY ・CV_BGR2HSV ・CV_BGR2HLS ・CV_BGR2Lab ・CV_BGR2YCrCb ・CV_BGR2XYZ ・CV_BGR2BGRA 等
エッジ検出 cvFilter2D()
画像とカーネルの畳み込みを行います.
void cvFilter2D(const CvArr* src, CvArr* dst, const CvMat* kernel, CvPoint anchor=cvPoint(-1,-1)); src 入力配列. dst 出力配列. kernel 畳み込み用のカーネル. anchor フィルタ対象ピクセルのカーネル内での相対位置. デフォルトはカーネルの中心を表す特別な値(-1,-1).
例えば
[ 1 1 1] [ 1 -8 1] ラプラシアンフィルタ [ 1 1 1]
で畳み込む場合は
また,他のエッジ検出関数として''cvSobel()'',''cvLaplace()'',''cvCanny()''関数が用意されています.
ただ,自前のカーネルで畳み込めるcvFilter2D()の利用を推奨します.
エッジ(edge)と輪郭(contour)は違うものなので注意してください.輪郭は物体の外形を表す線なので,面積,周囲長,円形度,重心などの特徴量を計算できますが,エッジ検出だけではできません.つまり,輪郭は閉じている(閉曲線)ということになります.
着目領域の指定 cvSetImageROI()
特定の領域だけに限定して処理したい場合,IplImageのROI(Region Of Interest:着目領域)を利用すると便利です.
void cvSetImageROI(IplImage* image, CvRect rect); image 画像ヘッダ. rect ROIを表す矩形.
- 画像の左下側にROIを設定し,その領域を上下反転させる.
ROIは矩形でしか指定できないので注意してください.
typedef struct CvRect { int x; /* 矩形の左角の x 座標 */ int y; /* 矩形の上角(あるいは下角)の y 座標 */ int width; /* 矩形の幅 */ int height; /* 矩形の高さ */ } CvRect; /* コンストラクタ */ /* 矩形の左上の座標(x,y)と幅・高さ(width,height)を指定する */ inline CvRect cvRect( int x, int y, int width, int height );
チャンネル分割 cvSplit()
マルチチャンネルの配列を複数のシングルチャンネルの配列に分割します.
RGB,HSV,L*a*b*などの色空間において各チャンネルの情報を個別に扱いたい時に利用します.
void cvSplit(const CvArr* src, CvArr* dst0, CvArr* dst1, CvArr* dst2, CvArr* dst3); #define cvCvtPixToPlane cvSplit src 入力配列. dst0...dst3 出力チャンネル.
閾値処理 cvThreshold()
画像に閾値処理を行って2値化します.
void cvThreshold(const CvArr* src, CvArr* dst, double threshold, double max_value, int threshold_type); src 入力配列 グレースケール. dst 出力配列. threshold 閾値. max_value threshold_type が CV_THRESH_BINARY と CV_THRESH_BINARY_INV のときに使用する最大値. threshold_type 閾値処理の種類 ・CV_THRESH_BINARY ・CV_THRESH_BINARY_INV ・CV_THRESH_TRUNC ・CV_THRESH_TOZERO ・CV_THRESH_TOZERO_INV